#include "ThreadPool.h"
#include "Task.h"

#include <iostream>

using std::cout;
using std::endl;
    

ThreadPool::ThreadPool(int threadNumber,int taskqueueCapa)
    :_threadNumber(threadNumber)
     ,_threads()
     ,_taskqueueCapa(taskqueueCapa)
     ,_taskque(_taskqueueCapa)
     ,isExit(false)

{

}
ThreadPool::~ThreadPool(){

}


void ThreadPool::start(){
    for(int i = 0;i < _threadNumber;++i){
        /* thread th(&ThreadPool::dotask,this); */
        /* _threads.push_back(std::move(th)); */
        _threads.push_back(thread(&ThreadPool::dotask,this));
    }
}

void ThreadPool::stop(){
    isExit = true;
    for(auto &th:_threads){
        th.join();
    }
}


void ThreadPool::addTask(ElemType ptask){
    if(ptask){
        _taskque.push(ptask); 
    }
}

ElemType ThreadPool::getTask(){
    ElemType ptmp = _taskque.pop();
    if(ptmp){
        return ptmp;
    }else{
        return nullptr;
    }

}
void ThreadPool::dotask(){
    ElemType ptask = getTask();
    if(ptask){
        ptask->process();// ->是指针用来访问指针所指向的对象
                         // 这里基类指针调用自己定义的纯虚函数
                         // 纯虚函数的实现肯定是通过派生类自己定义的函数实现
                         // 所以这里体现多态
    }else{
        cout <<"ptask = nullptr"<< endl;
    }
}
